package hyl.core;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.TimeZone;

/**
 * 更复杂的可以考虑用MyDate2
 */
public class MyDate {
	public static final int MS_DAY = 86400000;
	public static final int MS_HOUR = 3600000;
	public static final int MS_MINUTE = 60000;
	private final static String FORMAT_yyyy_MM_dd_HH_mm_ss = "yyyy-MM-dd HH:mm:ss";
	private final static String FORMAT_yyyyMMddHHmmss = "yyyyMMddHHmmss";
	private final static String FORMAT_yyyy_MM_dd = "yyyy-MM-dd";
	private final static String FORMAT_HH_mm_ss = "HH:mm:ss";

	public static void sleep(long millis) {
		try {
			Thread.sleep(millis);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	/**
	 * 获取当前时间 yyyyMMddHHmmss *
	 * 
	 * @return String
	 */
	public static String getCurrTime() {
		return MyFun.date2Str(getNow(), FORMAT_yyyyMMddHHmmss);
	}

	/**
	 * 获取当前时间 yyyy-MM-dd *
	 * 
	 * @return String
	 */
	public static String getStrDate() {
		return MyFun.date2Str(getNow(), FORMAT_yyyy_MM_dd);
	}

	/**
	 * 获取当前时间 HH:mm:ss *
	 * 
	 * @return String
	 */
	public static String getStrTime() {
		return MyFun.date2Str(getNow(), FORMAT_HH_mm_ss);
	}

	public static java.sql.Timestamp getTimeStamp(String dateTime) {
		return java.sql.Timestamp.valueOf(dateTime);
	}

	public static java.sql.Timestamp getTimeStamp(Date dateTime) {
		String s = MyFun.date2Str(dateTime, FORMAT_yyyy_MM_dd_HH_mm_ss);
		return java.sql.Timestamp.valueOf(s);
	}

	/**
	 * 获取当前时间 yyyy-MM-dd HH:mm:ss *
	 * 
	 * @return String
	 */
	public static String getStrDateTime() {
		return MyFun.date2Str(getNow(), FORMAT_yyyy_MM_dd_HH_mm_ss);
	}

	// 获取当天时间
	public static String getNow(String dateformat) {
		return MyFun.date2Str(getNow(), dateformat);
	}

	public static java.util.Date getNow() {
		return new java.util.Date();
	}

	/**
	 * 根据一个日期，返回是星期几的字符串
	 * 
	 * @param sdate
	 * @return
	 */
	public static String getWeek(String sdate) {
		// 再转换为时间
		Date date = MyFun.str2Date(sdate);
		return new SimpleDateFormat("EEEE").format(date);
	}

	/*
	 * 返回1是星期日 2是星期1
	 * 
	 * @param sdate
	 * 
	 * @return
	 */
	public static int getWeekNum(String sdate) {
		// 再转换为时间
		Date date = MyFun.str2Date(sdate);
		return getWeekNum(date);
	}

	public static int getWeekNum(Date date) {
		// 再转换为时间
		Calendar cal = Calendar.getInstance();
		cal.setTime(date);
		return cal.get(Calendar.DAY_OF_WEEK);
	}

	public static String getYesterday(String 日期格式) {
		Date d1 = addDays(new Date(), -1);
		return MyFun.date2Str(d1, 日期格式);
	}

	public static Date getYesterday() {
		Date d1 = addDays(new Date(), -1);
		return d1;
	}

	public static String addDays(String 开始日期, int 天数) {
		String 日期格式 = FORMAT_yyyy_MM_dd;
		return addDays(开始日期, 天数, 日期格式);
	}

	public static String addDays(String 开始日期, int 天数, String 日期格式) {
		if (MyFun.isEmpty(日期格式))
			日期格式 = FORMAT_yyyy_MM_dd;
		Date date1 = MyFun.str2Date(开始日期, 日期格式);
		if (date1 == null)
			date1 = getNow();
		return MyFun.date2Str(addDays(date1, 天数), 日期格式);
	}

	public static Date addDays(Date 开始日期, int 天数) {
		Calendar cal = Calendar.getInstance();
		cal.setTime(开始日期);
		cal.add(Calendar.DATE, 天数);
		return cal.getTime();
	}

	public static Date addMSeconds(Date 开始日期, int 毫秒数) {
		Calendar cal = Calendar.getInstance();
		cal.setTime(开始日期);
		cal.add(Calendar.MILLISECOND, 毫秒数);
		return cal.getTime();
	}

	public static Date addSeconds(Date 开始日期, int 秒数) {
		Calendar cal = Calendar.getInstance();
		cal.setTime(开始日期);
		cal.add(Calendar.SECOND, 秒数);
		return cal.getTime();
	}

	public static Date addWeeks(Date 开始日期, int 周数) {
		Calendar cal = Calendar.getInstance();
		cal.setTime(开始日期);
		cal.add(Calendar.DATE, 周数 * 7);
		return cal.getTime();
	}

	public static Date addMonths(Date 开始日期, int 月) {
		Calendar cal = Calendar.getInstance();
		cal.setTime(开始日期);
		cal.add(Calendar.MONTH, 月);
		return cal.getTime();
	}

	public static Date addYears(Date 开始日期, int 年) {
		Calendar cal = Calendar.getInstance();
		cal.setTime(开始日期);
		cal.add(Calendar.YEAR, 年);
		return cal.getTime();
	}

	public static Date addMinutes(Date 开始日期, int 分钟) {
		Calendar cal = Calendar.getInstance();
		cal.setTime(开始日期);
		cal.add(Calendar.MINUTE, 分钟);
		return cal.getTime();
	}

	public static Date addHours(Date 开始日期, int 小时) {
		Calendar cal = Calendar.getInstance();
		cal.setTime(开始日期);
		cal.add(Calendar.HOUR_OF_DAY, 小时);
		return cal.getTime();
	}

	/**
	 * 得到 time2-基准日的 间隔周数 的倍数 <br>
	 * 从0开始计数
	 */
	public static int getNumOfT2_T1(Date 基准日, Date time2, int max) {
		int a = getDaysOfT2_T1(基准日, time2);
		int b = a / max;
		return b;
	}

	/**
	 * 得到 time2-基准日的间隔周数 <br>
	 * 从0开始计数
	 */
	public static int getWeekNumOfT2_T1(Date 基准日, Date time2) {
		int a = getDaysOfT2_T1(基准日, time2);
		int b = a / 7;
		return b;
	}

	/**
	 * 得到 time2-time1 的间隔天数
	 *
	 */
	public static int getDaysOfT2_T1(Date time1, Date time2) {
		TimeZone tz = TimeZone.getDefault();
		// UTC毫秒加上这个偏移值，得到本地时区的时间
		long delta = tz.getRawOffset();
		long base = 24 * 3600 * 1000L;
		long day1 = (time1.getTime() + delta) / base;
		long day2 = (time2.getTime() + delta) / base;
		return (int) (day2 - day1);
	}

	/**
	 * 得到 time2-time1 的间隔秒数
	 *
	 */
	public static int getSecondsOfT2_T1(Date time1, Date time2) {
		int Millisecond = (int) (time2.getTime() / 1000 - time1.getTime() / 1000);
		return Millisecond;
	}

	/**
	 * 得到 time2-time1 的间隔毫秒数
	 *
	 */
	public static int getMSecondsOfT2_T1(Date date1, Date date2) {
		int Millisecond = (int) (date2.getTime() - date1.getTime());
		return Millisecond;
	}

	/** 获取当月第一天 */
	public static String getFirstOfMon(String dataformat) {
		String str = "";
		SimpleDateFormat sdf = new SimpleDateFormat(dataformat);
		Calendar lastDate = Calendar.getInstance();
		lastDate.set(Calendar.DATE, 1);// 设为当前月的1号
		str = sdf.format(lastDate.getTime());
		return str;
	}

	/** 计算当月最后一天,返回字符串 */
	public static String getLastOfMon(String dataformat) {
		String str = "";
		SimpleDateFormat sdf = new SimpleDateFormat(dataformat);
		Calendar lastDate = Calendar.getInstance();
		lastDate.set(Calendar.DATE, 1);// 设为当前月的1号
		lastDate.add(Calendar.MONTH, 1);// 加一个月，变为下月的1号
		lastDate.add(Calendar.DATE, -1);// 减去一天，变为当月最后一天
		str = sdf.format(lastDate.getTime());
		return str;
	}

	/** 上月第一天 */
	public static String getFirstOfLastMon(String dataformat) {
		String str = "";
		SimpleDateFormat sdf = new SimpleDateFormat(dataformat);
		Calendar lastDate = Calendar.getInstance();
		lastDate.set(Calendar.DATE, 1);// 设为当前月的1号
		lastDate.add(Calendar.MONTH, -1);// 减一个月，变为下月的1号
		str = sdf.format(lastDate.getTime());
		return str;
	}

	/** 获得上月最后一天的日期 */
	public static String getLastOfLastMon(String dataformat) {
		String str = "";
		SimpleDateFormat sdf = new SimpleDateFormat(dataformat);
		Calendar lastDate = Calendar.getInstance();
		lastDate.add(Calendar.MONTH, -1);// 减一个月
		lastDate.set(Calendar.DATE, 1);// 把日期设置为当月第一天
		lastDate.roll(Calendar.DATE, -1);// 日期回滚一天，也就是本月最后一天
		str = sdf.format(lastDate.getTime());
		return str;
	}

	/** 获得下一月第一天的日期 */
	public static String getFistOfNextMon(String dataformat) {
		String str = "";
		SimpleDateFormat sdf = new SimpleDateFormat(dataformat);
		Calendar lastDate = Calendar.getInstance();
		lastDate.add(Calendar.MONTH, 1);// 减一个月
		lastDate.set(Calendar.DATE, 1);// 把日期设置为当月第一天
		str = sdf.format(lastDate.getTime());
		return str;
	}

	/** 获得下一月最后一天的日期 */
	public static String getLastOfNextMon(String dataformat) {
		String str = "";
		SimpleDateFormat sdf = new SimpleDateFormat(dataformat);
		Calendar lastDate = Calendar.getInstance();
		lastDate.add(Calendar.MONTH, 1);// 加一个月
		lastDate.set(Calendar.DATE, 1);// 把日期设置为当月第一天
		lastDate.roll(Calendar.DATE, -1);// 日期回滚一天，也就是本月最后一天
		str = sdf.format(lastDate.getTime());
		return str;
	}

	/**
	 * 获得按照间隔日期计算下一次有效日期
	 * 
	 * @param startdate
	 * @param period    间隔单位 毫秒
	 * @return
	 */
	public static Date getEffDateOfNext(Date startdate, int period) {
		Calendar cal = Calendar.getInstance();
		Date dnow = new Date();
		cal.setTime(startdate);
		// System.out.println(MyFun.date2Str(cal.getTime()));
		// System.out.println(MyFun.date2Str(dnow));
		// System.out.println(dnow.after(cal.getTime()));
		while (dnow.after(cal.getTime())) {
			cal.add(Calendar.MILLISECOND, period);
		}
		return cal.getTime();
	}

	// / <summary>
	// / t1 小于 t2。 < 0
	// / t1 等于 t2。 ==0
	// / t1 大于 t2。 > 0
	// / </summary>
	// / <returns></returns>
	public static int compareTo(Date t1, Date t2) {
		return t1.compareTo(t2);
	}

	/**
	 * 是否闰年
	 * 
	 * @param year 年
	 * @return
	 */
	public static boolean isLeapYear(int year) {
		return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
	}

	/**
	 * 长日期转短日期
	 * 
	 * @param date 长日期
	 * @return
	 */
	public static java.sql.Date asSqlDate(java.util.Date date) {
		return new java.sql.Date(date.getTime());
	}

	/**
	 * 长日期转短日期
	 * 
	 * @param date 长日期
	 * @return
	 */
	public static java.sql.Time asSqlTime(java.util.Date date) {
		return new java.sql.Time(date.getTime());
	}

	/**
	 * 长日期转短日期
	 * 
	 * @param date 长日期
	 * @return
	 */
	public static java.sql.Timestamp asTimeStamp(java.util.Date date) {
		return new java.sql.Timestamp(date.getTime());
	}

	/**
	 * 短日期转长日期
	 * 
	 * @param date 短日期 java.sql.date
	 * @return
	 */
	public static java.util.Date asUtilDate(java.sql.Date date) {
		return new java.util.Date(date.getTime());
	}

	/**
	 * 短日期转长日期
	 * 
	 * @param date 短日期 java.sql.Timestamp
	 * @return
	 */
	public static java.util.Date asUtilDate(java.sql.Timestamp date) {
		return new java.util.Date(date.getTime());
	}

	/**
	 * 短日期转长日期
	 * 
	 * @param date 短日期 java.sql.Time
	 * @return
	 */
	public static java.util.Date asUtilDate(java.sql.Time date) {
		return new java.util.Date(date.getTime());
	}
}
